<?php
/***
 * 主要是解析 xml. 或组合 成 xml
 */ 
class Helper_xml{
    /****
     * 用 simplexml_load_string 解晰 xml 字符串
     * 变为 数组     
     */
    static function xmlparse($xmlString){
       if($xmlString instanceof SimpleXMLElement ){
          return self::simplexml2a($xmlString);
       }elseif(is_string($xmlString)){
          $Oxml=simplexml_load_string($xmlString);
          return self::simplexml2a($Oxml);
       }elseif($xmlString instanceof DOMNodeList){
           return self::domxml2a($xmlString);
       }
    }
    /***
     * 递归 运算, 解析 xml simplexml 对象
     *
     */
    static function simplexml2a($o){
        if(is_object($o)){
            settype($o,'Array');
        }
        if(is_array($o)){
           if(count($o)>0){
                foreach($o as $k=>$a){
                    $o[$k]=self::simplexml2a($a);
                }
           }else{
                $o='';
           }
        }
        return $o;
    }
    /***
     * 从数组生成 xml
     *  @ $arr 是数组与 simplexml 混合 
     *  以3个空格 区分 属性     
     *  $xmlstr=self::simpleArr2xml(
    array(
        //' '后 设置 GetItemTransactionsRequest 的属性,因为 数组键名,让人吃惊的强壮
        'GetItemTransactionsRequest xmlns="urn:ebay:apis:eBLBaseComponents"'=>array( 
            'IncludeContainingOrder'=>'true',
            'ItemID testK="testV"' =>array( // 设置 ItemId
                $itemid,
            ),
            'ListingEnhancement'=>array( // 转成 Xml 时 , 
                'Border',
                'CustomCode',
                'Featured',
                'Highlight'
            ),
        )
    ));
     */
    static public function simpleArr2xml($arr,$header=1){
        if($header){
            $str='<?xml version="1.0" encoding="utf-8" ?>';
        }else{
            $str='';
        }
        if(is_array($arr)){
            $str.="\r\n";
            foreach($arr as $k=>$v){
                $n=$k;
                if(($b=strpos($k,' '))>0){
                    $f=substr($k,0,$b);
                }else{
                    $f=$k;
                }
                if(is_array($v)&&is_numeric(implode('',array_keys($v)))){ 
                // 就是为 Array 为适应 Xml 的可以同时有多个键 所做的 变通
                        foreach($v as $cv){
                            $str.="<$n>".self::simpleArr2xml($cv,0)."</$f>\r\n";
                        }
                }elseif ($v instanceof SimpleXMLElement ){
                    $xml = $v->asXML();
                    $xml =preg_replace('/\<\?xml(.*?)\?\>/is','',$xml);
                    $str.=$xml;
                }else{
                    $str.="<$n>".self::simpleArr2xml($v,0)."</$f>\r\n";
                }
            }
        }else{
            $str.=$arr;
        }
        return $str;
    }
    
    /****
     * 对Dom document 进行解晰 . 
     * 接收      $DOMNodeList
     * 如:     
     * $response = $DOM -> getElementsByTagName('GetItemResponse');
     *      
     */ 
    static function domxml2a($DOMNodeList){
        if(!($DOMNodeList instanceof DOMNodeList)) return null;
        $a=array();
        for($i=0;$i<$DOMNodeList->length;$i++){
            if($DOMNodeList->item($i)){
                $DOMNode=$DOMNodeList->item($i);
                if($DOMNode->hasChildNodes()&&$DOMNode->childNodes->length>1){
                    self::domxml2a_saveItem($a,$DOMNode->nodeName,self::domxml2a($DOMNode->childNodes));
                }elseif($DOMNode->nodeName!='#text'){
                    self::domxml2a_saveItem($a,$DOMNode->nodeName,$DOMNode->nodeValue);
                }
            }
        }
        return $a;
    }
    /***
     * 附属 domxml2a , 存节点 . 
     */
    static function domxml2a_saveItem(&$arr,$itemName,$item){
        if(isset($arr[$itemName])){
            if(is_array($arr[$itemName])&&isset($arr[$itemName][0])){
                $arr[$itemName][]=$item;
            }else{
                $t=$arr[$itemName];
                $arr[$itemName]=array($t,$item);
            }
        }else{
            $arr[$itemName]=$item;
        }
    }
}